const { User, Role, Permission } = require('../models');
const { logger } = require('../utils/logger');
const sequelize = require('./database');

const initializeDatabase = async (reset = false) => {
  try {
    // 如果是重置模式，先删除所有表
    if (reset) {
      logger.info('正在重置数据库...');
      await sequelize.drop();
    }

    // 同步所有模型到数据库
    await sequelize.sync({ alter: true });

    // 创建默认角色（如果不存在）
    const roles = [
      {
        name: 'admin',
        description: '系统管理员',
        permissions: ['*'],
        isSystem: true
      },
      {
        name: 'staff',
        description: '工作人员',
        permissions: [
          'view_users',
          'manage_devices',
          'view_orders',
          'process_payments'
        ],
        isSystem: true
      },
      {
        name: 'student',
        description: '学生用户',
        permissions: [
          'view_profile',
          'manage_own_devices',
          'create_orders',
          'view_own_orders'
        ],
        isSystem: true
      },
      {
        name: 'user',
        description: '普通用户',
        permissions: [
          'view_profile',
          'manage_own_devices',
          'create_orders',
          'view_own_orders'
        ],
        isSystem: true
      }
    ];

    for (const roleData of roles) {
      const [role] = await Role.findOrCreate({
        where: { name: roleData.name },
        defaults: roleData
      });
      logger.info(`角色 ${role.name} 初始化完成`);
    }

    // 创建默认权限（如果不存在）
    const permissions = [
      {
        name: '查看用户',
        code: 'view_users',
        module: 'user',
        type: 'operation'
      },
      {
        name: '管理设备',
        code: 'manage_devices',
        module: 'device',
        type: 'operation'
      },
      {
        name: '查看订单',
        code: 'view_orders',
        module: 'order',
        type: 'operation'
      },
      {
        name: '处理支付',
        code: 'process_payments',
        module: 'payment',
        type: 'operation'
      },
      {
        name: '查看个人资料',
        code: 'view_profile',
        module: 'user',
        type: 'operation'
      },
      {
        name: '管理个人设备',
        code: 'manage_own_devices',
        module: 'device',
        type: 'operation'
      },
      {
        name: '创建订单',
        code: 'create_orders',
        module: 'order',
        type: 'operation'
      },
      {
        name: '查看个人订单',
        code: 'view_own_orders',
        module: 'order',
        type: 'operation'
      }
    ];

    for (const permissionData of permissions) {
      const [permission] = await Permission.findOrCreate({
        where: { code: permissionData.code },
        defaults: permissionData
      });
      logger.info(`权限 ${permission.code} 初始化完成`);
    }

    // 创建默认管理员用户（如果不存在）
    const [admin] = await User.findOrCreate({
      where: { username: 'admin' },
      defaults: {
        email: 'admin@example.com',
        password: 'admin123',
        role: 'admin',
        status: 'active'
      }
    });

    // 为管理员用户分配管理员角色
    const adminRole = await Role.findOne({ where: { name: 'admin' } });
    await admin.addRole(adminRole);

    logger.info('数据库初始化完成');
  } catch (error) {
    logger.error('数据库初始化失败:', error);
    throw error;
  }
};

// 检查是否有 --reset 参数
const shouldReset = process.argv.includes('--reset');

// 如果直接运行此文件，则执行初始化
if (require.main === module) {
  initializeDatabase(shouldReset)
    .then(() => {
      logger.info(shouldReset ? '数据库重置完成' : '数据库初始化完成');
      process.exit(0);
    })
    .catch((error) => {
      logger.error('操作失败:', error);
      process.exit(1);
    });
}

module.exports = { initializeDatabase }; 